# -*- coding: utf-8 -*-
# Author zwhset

'''
数据库类操作暂不写异常，具体调用方法需要写异常
Redis就不会返回异常 只返回01

'''

import pymysql
import redis

import conf

class Mysql(object):
    '''Mysql Base Class'''

    def __init__(self):
        '''Init Mysql object'''

        self._init_conn()

    def fetchone(self, query, is_dict=True):
        '''返回单条记录， 一般不用'''

        self._init_conn()

        if is_dict:
            self.dict_cursor.execute(query)
            return self.dict_cursor.fetchone()

        self.cursor.execute(query)
        return self.cursor.fetchone()

    def fetchall(self, query, is_dict=True):
        '''返回多条记录'''

        self._init_conn()

        if is_dict:
            self.dict_cursor.execute(query)
            return self.dict_cursor.fetchall()

        self.cursor.execute(query)
        return self.cursor.fetchall()

    def write(self, query):
        '''
        写操作

        因为写操作涉及到commit的问题，为了避免提交不上的问题，单接连接单处理。

        '''
        conn = self._init_conn()
        cursor = conn.cursor()

        cursor.execute(query)

        conn.commit(); cursor.close(); conn.close()

        return cursor.lastrowid

    def commit(self, *args):
        '''
        事物操作

        因为写操作涉及到commit的问题，为了避免提交不上的问题，单接连接单处理。

        '''
        conn = self._init_conn()
        cursor = conn.cursor()

        # 遍历写query，然后commit
        for query in args:
            cursor.execute(query)

        conn.commit(); cursor.close(); conn.close()

        return cursor.lastrowid

    def _init_conn(self):
        '''初始化链接'''
        params = {
            'host': conf.MYSQL_HOST,
            'port': conf.MYSQL_PORT,
            'user': conf.MYSQL_USER,
            'password': conf.MYSQL_PASS,
            'database': conf.MYSQL_DB,
            'charset': 'utf8',
        }
        self.conn = pymysql.connect(**params)
        self.dict_cursor = self.conn.cursor(pymysql.cursors.DictCursor)
        self.cursor = self.conn.cursor()

        return self.conn

class Redis(object):
    '''Redis connect Object'''

    def __int__(self):
        '''为了统一，使用cursor作为调用方式'''
        params = {
            'host' : conf.REDIS_HOST,
            'port' : conf.REDIS_PORT,
            'db'   : conf.REDIS_DB,
            'password' : conf.REDIS_PASS,
            'encoding' : 'utf-8',
        }
        self.cursor = redis.Redis(**params)